﻿using System;
using BingoRedis;
using BingoServerCommon.Db;
using BingoServerCommon.Db.Pool;
using BingoServerCommon.Log4net;
using BingoServerCommon.Model;
using HPSocketCS;

/*
 *在现有项目架构下，每一次停止服务端，一定一定一定要把Redis里的内容清空！！！！！！！！！！！！！！否则下次启动可能会有不可预料的后果
 */

/*
 * 通用的redis里面，(默认配置下)有不少于16个的数据库，db0 ~ db15
 * 现在初步决定第0个存储hallServer分配状况、GameServer分配状况
 * 第1个存储room列表中所有room的分配状况。
 *	
 */

/*
 *todo
 * redis里，存储hallServer和GameServer的结构，试用set或者zset，还没有确定。
 * 目前倾向于使用zset，在set最后的元素，对应的服务器，总是负载最轻的。
 * 2018年6月13日 18点53分
 *
 */

namespace BingoHallServerConsole
{


	internal class Program
	{
		/// <summary>
		/// 服务器通用的连接池对象
		/// </summary>
		public static ConnectionPool ConnectionPool = null;

		#region redis内容

		/// <summary>
		/// redis里面的key
		/// </summary>
		public static string HallServerConfigKey = "hallServerConfig";



		#endregion

		private static void Main(string[] args)
		{
			try
			{
				Console.ForegroundColor = ConsoleColor.Yellow;
				Console.WriteLine("		Hall Server 启动中 。。。。。");
				Console.ResetColor();


				//本机端口
				ushort port = 10000;

				#region 初始化Redis。先连接redis，如果不能连接，后续都不用执行了
				var testResult = RedisInit.Init();
				if (!testResult)
				{
					LogHelper.WriteFatal("初始化Redis出错，后续一切行为停止");
					return;
				}
				//RedisDemo.Aaa();
				#endregion

				#region 启动时，先读取redis中的hallServer当前状况，判断情况

				//hallServer
				RedisHelper redis = new RedisHelper(0);
				var hallServerConfig = redis.SortedSetRangeByRank<HallServer>(HallServerConfigKey);
				if (hallServerConfig.Count == 0)
				{
					//HallServer thisHallServer = new HallServer();

					//var addResult = redis.SortedSetAdd(HallServerConfigKey, thisHallServer, thisHallServer.sortIndex);
					//if (addResult == false)
					//{
					//	LogHelper.WriteFatal($"将当前hallServer信息写入Redis出错，当前hallServer.sortIndex = {thisHallServer.sortIndex}");
					//	return;
					//}
					//else
					//{
					//	//加入失败。此服务器不必启动了。
					//	Console.WriteLine("----------------------------");
					//	return;
					//}
				}
				else
				{
					var curServerList = redis.SortedSetRangeByRank<HallServer>(HallServerConfigKey);
					//得到 List<HallServer>
					//先判断是否有
					//var ifContains = curServerList.Exists(s => s.serverIp == ipv4);
					//if (!ifContains)
					//{
					//	HallServer server = new HallServer();
					//	server.serverIp = ipv4;
					//	server.serverName = hostName;
					//	server.serverPort = port;
					//	server.sortIndex = curServerList.Count + 1;
					//	//加redis
					//	redis.SortedSetAdd(HallServerConfigKey, server, curServerList.Count + 1);
					//}
				}
				#endregion

				var bingoTcpPackServer = new HallTcpPackServer();
				bingoTcpPackServer.Start(port);

				if (HallTcpPackServer.Server.State == ServiceState.Started)
				{
					Console.WriteLine($"    服务器启动成功  \t port:{port}\n");
				}

				Console.ForegroundColor = ConsoleColor.DarkYellow;
				Console.WriteLine("    停止服务器请按Q键\n");
				Console.ResetColor();


				#region 注册各个业务

				//注册所有的业务的各自的packages
				PackageRegister.PackagesRegister();

				#endregion


				#region mysql连接池

				//建立mysql连接池
				ConnectionPool = MysqlInit.Init();
				if (ConnectionPool == null)
				{
					Console.ForegroundColor = ConsoleColor.Red;
					Console.WriteLine("连接池初始化出错！");
					Console.ResetColor();
					return;
				}
				//TestConnectionPool t = new TestConnectionPool();
				//t.Test();

				#endregion


			
				while (true)
				{
					ConsoleKey InputKey = Console.ReadKey().Key;
					switch (InputKey)
					{
						case ConsoleKey.Q:
							HallTcpPackServer.Server.Stop();
							Console.WriteLine("\n");
							Console.WriteLine("关闭服务器成功");
							break;
						case ConsoleKey.S:
							HallTcpPackServer.BroadCast("");
							Console.WriteLine("\n");
							Console.WriteLine("群发消息到所有客户端成功");
							break;
					}
				}

			}
			catch (Exception e)
			{
				LogHelper.WriteFatal("Program.Main", e);
			}
		}
	}
}
